package com.ldzy.webase.service.impl;

import cn.hutool.json.JSONUtil;
import com.ldzy.webase.dao.PressMapper;
import com.ldzy.webase.entity.Comment;
import com.ldzy.webase.entity.Press;
import com.ldzy.webase.exception.ExceptionResponse;
import com.ldzy.webase.exception.ExceptionResponseCode;
import com.ldzy.webase.service.PressService;
import org.apache.ibatis.annotations.Insert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

/**
 * @author ：Lq
 * @version ：1.0
 * @date ：2022/10/25 21:16
 * @description ：t_press-咨询表-业务层
 */
@Service
public class PressServiceImpl implements PressService {
    @Autowired
    PressMapper pressMapper;

    /**
     * @author ：Lq
     * @version ：1.0
     * @date ：2022/10/25 21:16
     * @description ：获取最新咨询列表
     * @Param press 可根据(consultId咨询类别，uid用户编号，status状态)进行查询;也可不要参数，默认查询全部，可分页查询
     * 可分页查询
     */
    @Override
    public List<Press> getPressAllByMore(Press press, Integer pageNum, Integer pageSize) {
        Integer curPage = null;

        System.out.println("pageNum:" + pageNum + "pageSize:" + pageSize);
        if (pageNum != null && pageSize != null) {
            // 分页字段不为空就执行这里的
            curPage = (pageNum - 1) * pageSize;
        }
        System.out.println("curPage:" + curPage + "pageSize:" + pageSize);

        List<Press> pressAllByMore = pressMapper.getPressAllByMore(press, curPage, pageSize);
        if (pressAllByMore.size() == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOT_DATA); // (401, "无数据")
        }

        // 循环遍历查询出来的咨询/话题，格式化图片路径
        // 循环遍历查询出来的咨询/话题，添加字段：publishDateInterval(String)发布日期距离现在时间间隔多久，示例：2小时前
        for (int i = 0; i < pressAllByMore.size(); i++) {
            // 取出图片路径
            String pressImages = pressAllByMore.get(i).getPressImages();
            // 判断不为空
            if (pressImages != null && !pressImages.equals("")) {
                // 利用split进行分隔为数组
                String[] strList = pressImages.split(";");
                //保留数组格式输出
//                System.out.println(JSONUtil.toJsonStr(strList));
                // 将分割后的图片路径存入
                pressAllByMore.get(i).setPressImagesList(strList);
            }

            // 取出发布日期
            Timestamp publishDate = pressAllByMore.get(i).getPublishDate();
            // 获取当前时间
            Date nowDate = new Date();
            // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
            long times = nowDate.getTime() - publishDate.getTime();
            long day = times / (24 * 60 * 60 * 1000); // 天数
            long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
            long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
            long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

            // 创建可变字符缓冲对象StringBuffer，只是为了方便
            StringBuffer sb = new StringBuffer();

            if (day > 7) {
                // 如果大于7天不执行操作-显示日期
            } else if (day > 0) {
                sb.append(day + "天前");
            } else if (hour > 0) {
                sb.append(hour + "小时前");
            } else if (min > 0) {
                sb.append(min + "分钟前");
            } else if (sec < 10) {
                sb.append("刚刚");
            } else {
                sb.append(sec + "秒前");
            }

            // sb.toString()转换成字符串对象存入
            pressAllByMore.get(i).setPublishDateInterval(sb.toString());
        }

        return pressAllByMore;
    }

    /**
     * @author ：Lq
     * @date ：2022/10/28 19:02
     * @description ：获取24小时内热门的咨询/话题列表,可分页查询，可根据(用户编号，咨询类别，发布时间)进行查询;也可不要参数，默认查询全部，可分页查询
     */
    @Override
    public List<Press> getPressByInterval24HourHot(Press press, Integer pageNum, Integer pageSize) {
        Integer curPage = null;

        System.out.println("pageNum:" + pageNum + "pageSize:" + pageSize);
        if (pageNum != null && pageSize != null) {
            // 分页字段不为空就执行这里的
            curPage = (pageNum - 1) * pageSize;
        }
        System.out.println("curPage:" + curPage + "pageSize:" + pageSize);

        List<Press> pressByInterval24HourHot = pressMapper.getPressByInterval24HourHot(press, curPage, pageSize);
        if (pressByInterval24HourHot.size() == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_PRESS_NOT_24HOUR_HOT);// (401, "24小时内无最新数据")
        }

        // 循环遍历查询出来的咨询/话题，格式化图片路径
        for (int i = 0; i < pressByInterval24HourHot.size(); i++) {
            // 取出图片路径
            String pressImages = pressByInterval24HourHot.get(i).getPressImages();

            // 判断不为空
            if (pressImages != null && !pressImages.equals("")) {
                // 利用split进行分隔为数组
                String[] strList = pressImages.split(";");

                //保留数组格式输出
//                System.out.println(JSONUtil.toJsonStr(strList));

                // 将分割后的图片路径存入
                pressByInterval24HourHot.get(i).setPressImagesList(strList);
            }

            // 取出发布日期
            Timestamp publishDate = pressByInterval24HourHot.get(i).getPublishDate();
            // 获取当前时间
            Date nowDate = new Date();
            // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
            long times = nowDate.getTime() - publishDate.getTime();
            long day = times / (24 * 60 * 60 * 1000); // 天数
            long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
            long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
            long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

            // 创建可变字符缓冲对象StringBuffer，只是为了方便
            StringBuffer sb = new StringBuffer();

            if (day > 7) {
                // 如果大于7天不执行操作
            } else if (day > 0) {
                sb.append(day + "天前");
            } else if (hour > 0) {
                sb.append(hour + "小时前");
            } else if (min > 0) {
                sb.append(min + "分钟前");
            } else if (sec < 10) {
                sb.append("刚刚");
            } else {
                sb.append(sec + "秒前");
            }

            // sb.toString()转换成字符串对象存入
            pressByInterval24HourHot.get(i).setPublishDateInterval(sb.toString());
        }

        return pressByInterval24HourHot;
    }

    /**
     * @author ：Lq
     * @date ：2022/10/28 19:12
     * @description ：获取历史最热门的咨询/话题列表，可根据(用户编号，咨询类别，发布时间)进行查询;也可不要参数，默认查询全部，可分页查询
     */
    @Override
    public List<Press> getPressByMostHot(Press press, Integer pageNum, Integer pageSize) {
        Integer curPage = null;

        System.out.println("pageNum:" + pageNum + "pageSize:" + pageSize);
        if (pageNum != null && pageSize != null) {
            // 分页字段不为空就执行这里的
            curPage = (pageNum - 1) * pageSize;
        }
        System.out.println("curPage:" + curPage + "pageSize:" + pageSize);

        List<Press> pressByMostHot = pressMapper.getPressByMostHot(press, curPage, pageSize);
        if (pressByMostHot.size() == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOT_DATA);// (401, "无数据")
        }

        // 循环遍历查询出来的咨询/话题，格式化图片路径
        for (int i = 0; i < pressByMostHot.size(); i++) {
            // 取出图片路径
            String pressImages = pressByMostHot.get(i).getPressImages();

            // 判断不为空
            if (pressImages != null && !pressImages.equals("")) {
                // 利用split进行分隔为数组
                String[] strList = pressImages.split(";");

                //保留数组格式输出
//                System.out.println(JSONUtil.toJsonStr(strList));

                // 将分割后的图片路径存入
                pressByMostHot.get(i).setPressImagesList(strList);
            }

            // 取出发布日期
            Timestamp publishDate = pressByMostHot.get(i).getPublishDate();
            // 获取当前时间
            Date nowDate = new Date();
            // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
            long times = nowDate.getTime() - publishDate.getTime();
            long day = times / (24 * 60 * 60 * 1000); // 天数
            long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
            long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
            long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

            // 创建可变字符缓冲对象StringBuffer，只是为了方便
            StringBuffer sb = new StringBuffer();

            if (day > 7) {
                // 如果大于7天不执行操作
            } else if (day > 0) {
                sb.append(day + "天前");
            } else if (hour > 0) {
                sb.append(hour + "小时前");
            } else if (min > 0) {
                sb.append(min + "分钟前");
            } else if (sec < 10) {
                sb.append("刚刚");
            } else {
                sb.append(sec + "秒前");
            }

            // sb.toString()转换成字符串对象存入
            pressByMostHot.get(i).setPublishDateInterval(sb.toString());
        }

        return pressByMostHot;
    }

    /**
     * @author ：Lq
     * @date ：2022/10/29 19:57
     * @description ：获取最新评论时间的咨询，可根据(consultId咨询类别，status状态，uid用户编号)进行查询;也可不要参数，可分页查询
     */
    @Override
    public List<Press> getPressByNewCommentDate(Press press, Integer pageNum, Integer pageSize) {
        Integer curPage = null;

        System.out.println("pageNum:" + pageNum + "pageSize:" + pageSize);
        if (pageNum != null && pageSize != null) {
            // 分页字段不为空就执行这里的
            curPage = (pageNum - 1) * pageSize;
        }
        System.out.println("curPage:" + curPage + "pageSize:" + pageSize);

        List<Press> pressByNewCommentDate = pressMapper.getPressByNewCommentDate(press, curPage, pageSize);
        if (pressByNewCommentDate.size() == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOT_DATA);// (401, "无数据")
        }

        // 循环遍历查询出来的咨询/话题，格式化图片路径
        for (int i = 0; i < pressByNewCommentDate.size(); i++) {
            // 取出图片路径
            String pressImages = pressByNewCommentDate.get(i).getPressImages();

            // 判断不为空
            if (pressImages != null && !pressImages.equals("")) {
                // 利用split进行分隔为数组
                String[] strList = pressImages.split(";");

                //保留数组格式输出
//                System.out.println(JSONUtil.toJsonStr(strList));

                // 将分割后的图片路径存入
                pressByNewCommentDate.get(i).setPressImagesList(strList);
            }

            // 取出发布日期
            Timestamp publishDate = pressByNewCommentDate.get(i).getPublishDate();
            // 获取当前时间
            Date nowDate = new Date();
            // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
            long times = nowDate.getTime() - publishDate.getTime();
            long day = times / (24 * 60 * 60 * 1000); // 天数
            long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
            long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
            long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

            // 创建可变字符缓冲对象StringBuffer，只是为了方便
            StringBuffer sb = new StringBuffer();

            if (day > 7) {
                // 如果大于7天不执行操作
            } else if (day > 0) {
                sb.append(day + "天前");
            } else if (hour > 0) {
                sb.append(hour + "小时前");
            } else if (min > 0) {
                sb.append(min + "分钟前");
            } else if (sec < 10) {
                sb.append("刚刚");
            } else {
                sb.append(sec + "秒前");
            }

            // sb.toString()转换成字符串对象存入
            pressByNewCommentDate.get(i).setPublishDateInterval(sb.toString());
        }

        return pressByNewCommentDate;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 17:39
     * @description ：根据pressId，获取咨询的详情信息
     */
    @Override
    public Press getPressByPressId(Integer pressId, Integer uid) {
        Press press = pressMapper.getPressByPressId(pressId, uid);

        if (press == null) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOT_PRESS);// (401, "话题已删除")
        }

        // 取出图片路径
        String pressImages = press.getPressImages();

        // 判断不为空
        if (pressImages != null && !pressImages.equals("")) {
            // 利用split进行分隔为数组
            String[] strList = pressImages.split(";");

            //保留数组格式输出
//                System.out.println(JSONUtil.toJsonStr(strList));

            // 将分割后的图片路径存入
            press.setPressImagesList(strList);
        }

        // 取出发布日期
        Timestamp publishDate = press.getPublishDate();
        // 获取当前时间
        Date nowDate = new Date();
        // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
        long times = nowDate.getTime() - publishDate.getTime();
        long day = times / (24 * 60 * 60 * 1000); // 天数
        long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
        long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
        long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

        // 创建可变字符缓冲对象StringBuffer，只是为了方便
        StringBuffer sb = new StringBuffer();

        if (day > 7) {
            // 如果大于7天不执行操作
        } else if (day > 0) {
            sb.append(day + "天前");
        } else if (hour > 0) {
            sb.append(hour + "小时前");
        } else if (min > 0) {
            sb.append(min + "分钟前");
        } else if (sec < 10) {
            sb.append("刚刚");
        } else {
            sb.append(sec + "秒前");
        }

        // sb.toString()转换成字符串对象存入
        press.setPublishDateInterval(sb.toString());

        return press;
    }

    /**
     * @author ：Lq
     * @date ：2022/10/30 13:11
     * @description ：获取咨询列表的总数，也可根据24小时内的咨询列表获取总数
     */
    @Override
    public int getPressTotalOrBy24Hour(Press press, Boolean is24Hour) {
        // 获取到总数total
        int pressTotal = pressMapper.getPressTotalOrBy24Hour(press, is24Hour);

        return pressTotal;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/2 11:04
     * @description ：发布咨询/话题 (成功返回1，否则返回0)
     */
    @Override
    public int addPress(Press press) {
        int i = pressMapper.addPress(press);

        if (i == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_ADD_PRESS); // (401, "发布失败，预期外的错误")
        }

        return i;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 15:12
     * @description ：咨询点赞操作-数据库中有使用联合唯一索引，所以会有重复的点赞会自动排除
     */
    @Override
    public int addPressLike(Integer pressId, Integer uid) {
        int i;

        try {
            i = pressMapper.addPressLike(pressId, uid);
        } catch (Exception e) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_ADD_PRESSLIKE); // (401, "点赞失败，重复点赞")
        }

        return i;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 18:30
     * @description ：咨询取消点赞操作-数据库中有使用联合唯一索引，所以会有重复的点赞会自动排除
     */
    @Override
    public int pressCancelLike(Integer pressId, Integer uid) {
        int i;

        i = pressMapper.pressCancelLike(pressId, uid);

        return i;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 15:13
     * @description ：获取资讯/话题评论列表
     */
    @Override
    public List<Comment> getCommentByPressId(Comment comment, Integer pageNum, Integer pageSize) {
        Integer curPage = null;

        System.out.println("pageNum:" + pageNum + "pageSize:" + pageSize);
        if (pageNum != null && pageSize != null) {
            // 分页字段不为空就执行这里的
            curPage = (pageNum - 1) * pageSize;
        }
//        System.out.println("curPage:" + curPage + "pageSize:" + pageSize);

        List<Comment> commentByPressId = pressMapper.getCommentByPressId(comment, curPage, pageSize);

        if (commentByPressId.size() == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_COMMENT_NOT);// (220, "无评论数据")
        }

        // 循环遍历查询出来的评论，格式化图片路径
        for (int i = 0; i < commentByPressId.size(); i++) {
            // 取出图片路径
            String contentImages = commentByPressId.get(i).getContentImages();

            // 判断不为空
            if (contentImages != null && !contentImages.equals("")) {
                // 利用split进行分隔为数组
                String[] strList = contentImages.split(";");

                //保留数组格式输出
//                System.out.println(JSONUtil.toJsonStr(strList));

                // 将分割后的图片路径存入
                commentByPressId.get(i).setCommentImagesList(strList);
            }

            // 取出发布日期
            Timestamp commentDate = commentByPressId.get(i).getCommentDate();
            // 获取当前时间
            Date nowDate = new Date();
            // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
            long times = nowDate.getTime() - commentDate.getTime();
            long day = times / (24 * 60 * 60 * 1000); // 天数
            long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
            long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
            long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

            // 创建可变字符缓冲对象StringBuffer，只是为了方便
            StringBuffer sb = new StringBuffer();

            if (day > 7) {
                // 如果大于7天不执行操作
            } else if (day > 0) {
                sb.append(day + "天前");
            } else if (hour > 0) {
                sb.append(hour + "小时前");
            } else if (min > 0) {
                sb.append(min + "分钟前");
            } else if (sec < 10) {
                sb.append("刚刚");
            } else {
                sb.append(sec + "秒前");
            }

            // sb.toString()转换成字符串对象存入
            commentByPressId.get(i).setCommentDateInterval(sb.toString());
        }

        return commentByPressId;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/5 20:44
     * @description ：发表评论 (成功返回1，否则返回0)
     */
    @Override
    public int addComment(Comment comment) {
        int i = pressMapper.addComment(comment);

        if (i == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_ADD_PRESS); // (401, "发布失败，预期外的错误")
        }

        return i;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/21 20:13
     * @description ：搜索（全文检索）- 获取总数total
     */
    @Override
    public int getSearchPressTotal(String searchValue) {
        int searchPressTotal = pressMapper.getSearchPressTotal(searchValue);

        return searchPressTotal;
    }

    /**
     * @author ：Lq
     * @date ：2022/11/21 19:18
     * @description ：搜索（全文检索）
     */
    @Override
    public List<Press> searchPress(String searchValue, Integer pageNum, Integer pageSize) {
        Integer curPage = null;

        System.out.println("pageNum:" + pageNum + "pageSize:" + pageSize);
        if (pageNum != null && pageSize != null) {
            // 分页字段不为空就执行这里的
            curPage = (pageNum - 1) * pageSize;
        }

        List<Press> pressList = pressMapper.searchPress(searchValue, curPage, pageSize);
        if (pressList.size() == 0) {
            throw ExceptionResponse.build(ExceptionResponseCode.ERROR_NOT_DATA); // (401, "无数据")
        }

        // 循环遍历查询出来的咨询/话题，格式化图片路径
        // 循环遍历查询出来的咨询/话题，添加字段：publishDateInterval(String)发布日期距离现在时间间隔多久，示例：2小时前
        for (int i = 0; i < pressList.size(); i++) {
            // 取出图片路径
            String pressImages = pressList.get(i).getPressImages();
            // 判断不为空
            if (pressImages != null && !pressImages.equals("")) {
                // 利用split进行分隔为数组
                String[] strList = pressImages.split(";");
                //保留数组格式输出
//                System.out.println(JSONUtil.toJsonStr(strList));
                // 将分割后的图片路径存入
                pressList.get(i).setPressImagesList(strList);
            }

            // 取出发布日期
            Timestamp publishDate = pressList.get(i).getPublishDate();
            // 获取当前时间
            Date nowDate = new Date();
            // 计算发布日期距离当前时间过去了多久，获取计算后的时间戳（单位：毫秒数）
            long times = nowDate.getTime() - publishDate.getTime();
            long day = times / (24 * 60 * 60 * 1000); // 天数
            long hour = (times / (60 * 60 * 1000) - day * 24); // 小时
            long min = ((times / (60 * 1000)) - day * 24 * 60 - hour * 60); // 分钟
            long sec = (times / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); // 秒

            // 创建可变字符缓冲对象StringBuffer，只是为了方便
            StringBuffer sb = new StringBuffer();

            if (day > 7) {
                // 如果大于7天不执行操作-显示日期
            } else if (day > 0) {
                sb.append(day + "天前");
            } else if (hour > 0) {
                sb.append(hour + "小时前");
            } else if (min > 0) {
                sb.append(min + "分钟前");
            } else if (sec < 10) {
                sb.append("刚刚");
            } else {
                sb.append(sec + "秒前");
            }

            // sb.toString()转换成字符串对象存入
            pressList.get(i).setPublishDateInterval(sb.toString());
        }

        return pressList;
    }
}
